/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package lexer;

import java.io.IOException;
import java.io.Reader;
import java.io.StreamTokenizer;

/**
 *
 * @author Antonio
 */
public class AnalizzatoreLessicale {

    private Simboli simbolo;
    private StreamTokenizer in;

    public AnalizzatoreLessicale(Reader r) {

        in = new StreamTokenizer(r);

        setupToken();

    }

    private void setupToken() {

        // setto lo streamTokenizer
        in.resetSyntax();
        in.eolIsSignificant(false);

        // caratteri che possono costituire un token
        in.wordChars('A', 'Z');
        in.wordChars('a', 'z');
        in.wordChars('0', '9');
        in.wordChars('(', ')');
        in.wordChars('[', ']');
        in.wordChars('|', '|');
        in.wordChars('<', '>');
        in.wordChars('^', '^');
        in.wordChars('!', '=');
        in.wordChars('&', '&');

        in.whitespaceChars('\u0000', ' ');
    }// setupToken

    public String getString() {

        return in.sval;
    }// getString

    public Simboli prossimoSimbolo() {
        try {
            switch (in.nextToken()) {

                case StreamTokenizer.TT_EOF:
                    simbolo = Simboli.EOF;
                    break;

                case StreamTokenizer.TT_WORD:
                    // verifica prima se la parola e' riservata
                    if (in.sval.equalsIgnoreCase("||")) {

                        simbolo = Simboli.OR;
                    } else if (in.sval.equalsIgnoreCase("&&")) {

                        simbolo = Simboli.AND;
                    } else if (in.sval.equalsIgnoreCase("!")) {

                        simbolo = Simboli.NOT;
                    } else if (in.sval.equalsIgnoreCase("relop")) {

                        simbolo = Simboli.RELOP;
                    } else if (in.sval.equalsIgnoreCase("==")) {

                        simbolo = Simboli.EQ;
                    } else if (in.sval.equalsIgnoreCase("!=")) {

                        simbolo = Simboli.NEQ;
                    } else if (in.sval.equalsIgnoreCase(">")) {

                        simbolo = Simboli.GT;
                    } else if (in.sval.equalsIgnoreCase(">=")) {

                        simbolo = Simboli.GE;
                    } else if (in.sval.equalsIgnoreCase("<")) {

                        simbolo = Simboli.LT;
                    } else if (in.sval.equalsIgnoreCase("<=")) {

                        simbolo = Simboli.LE;
                    } else if (in.sval.equalsIgnoreCase("^")) {

                        simbolo = Simboli.POWER;
                    } else if (in.sval.equalsIgnoreCase("/")) {

                        simbolo = Simboli.DIV;
                    } else if (in.sval.equalsIgnoreCase("%")) {

                        simbolo = Simboli.REM;
                    } else if (in.sval.equalsIgnoreCase("*")) {

                        simbolo = Simboli.MULT;
                    } else if (in.sval.equalsIgnoreCase("-")) {

                        simbolo = Simboli.MINUS;
                    } else if (in.sval.equalsIgnoreCase("+")) {

                        simbolo = Simboli.PLUS;
                    } else if (in.sval.equalsIgnoreCase("(")) {

                        simbolo = Simboli.TONDA_APERTA;
                    } else if (in.sval.equalsIgnoreCase(")")) {

                        simbolo = Simboli.TONDA_CHIUSA;
                    } else if (in.sval.equalsIgnoreCase("[")) {

                        simbolo = Simboli.QUADRA_APERTA;
                    } else if (in.sval.equalsIgnoreCase("]")) {

                        simbolo = Simboli.QUADRA_CHIUSA;
                    } else {// identifica la parola non riservata

                        try {

                            Integer.parseInt(this.getString());
                            simbolo = Simboli.NUM;
                        } catch (NumberFormatException e) {

                            simbolo = Simboli.ID;
                        }


                    }
                    break;

                default:
                    simbolo = Simboli.CHAR_INVALIDO;
                    break;
            }
        } catch (IOException e) {

            simbolo = Simboli.EOF;
        }
        return simbolo;
    }// prossimoSimbolo
}
